Titkosítás PostgreSQL-ben

Amennyiben olyan alkalmazást fejlesztünk (legyen az akár webes vagy vékony kliens), amelyben a felhasználók végrehajthatnak utasításokat az adatbázison, a felhasználók bizonyos adatait el kell tárolnunk. Nem kell sokra gondolni, pl. beregisztrálva, bejelentkezve kommentelni szeretnének, azaz egy adatbázistáblához egy új rekordot "illesztenek".

A legkézenfekvőbb a jelszó kérdése, amellyel valamit mindenképpen kezdenünk kell. Soha, de soha nem tárolnunk jelszavakat ugyanis csak úgy, karakteres vagy akármilyen formátumban az adatbázisban. Igen, tudom, a jelszó feltörhetetlen, amivel adminként hozzá tudsz férni az adattáblák tartalmához.

Mivel olyan nincsen hogy valami feltörhetetlen, ismerkedjünk meg a PostgreSQL beépített tikosításával, amellyel a jelszavakat úgy tudjuk eltárolni, hogy az értelmezhetetlen legyen majd hekkerünknek (persze csak egy ideális világban).

Ez nem más, mint a pgcrypto, amelyhez a salt-ot használjuk. A salt egy olyan kriptográfiai eszköz, amely minden jelszavat véletlenszerűen generál le, emiatt az olyan problémákat is kiküszöböli, mint az, hogy két ugyanolyan jelszavat ugyanazzal a generált kóddal tárolnánk le az adatbázisban, ezzel megkönnyítve hekkerünk dolgát. Nem, még az 1234 jelszót is különbözőképpen tárolja el az adatbázisban, ha az többször fordul elő.

Miután a salt kriptográfia segítségével eltároltuk az adatbázisban a jelszavunkat, annak visszafejtésénél jön be a képbe a PostgreSQL PGRCYPTO kiterjesztése, ugyanis az fogja visszaadni a felhasználó által megadott jelszavat, amennyiben megfelelőt adott meg a felhasználó (vagy nem ad vissza semmit, ha nem volt jó a megadott jelszó).

Amit tennünk kell:

- először telepíteni kell a PostgreSQL-re a PGRCYPTO kiterjesztést a következő paranccsal:

CREATE EXTENSION pgcrypto;
Ennyi. Hozzunk létre egy adattáblát csak teszt jelleggel, benne egy password mezővel (text típussal), majd egy rekordot helyezzünk el benne a következő paranccsal:

INSERT INTO jelszavak (password) VALUES (crypt('1234', gen_salt('bf', 8)));
Ahol a 1234 maga a jelszavunk, a gen_salt('bf', 8)) paranccsal pedig azt adjuk meg, hogy a titkosítás milyen szintű "blowfish"-el történjen meg, produkciós környezetben minimum 8-as érték ajánlott.

A jelszavat a következő scripttel pedig le is tudjuk kérdezni. Ha kapunk vissza választ, akkor az azt jelenti, hogy a lekérdezésnél megfelelő jelszavat adtunk meg, ellenkező esetben nem kapunk vissza rekordot:

SELECT * FROM jelszavak WHERE password = crypt('1234', password);
Igazándiból ennyi az egész, minimális munkát jelent, cserébe nem teszünk közszemlére olyan adatokat, amelyet nem túlzottan tanácsos csak úgy eltárolni az adattáblákban.